#include "DEV_Config.h"

int GPIO_Init(void)
{
    gpio_reset_pin(EPD_SCK_PIN);
    gpio_set_direction(EPD_SCK_PIN,GPIO_MODE_OUTPUT);
    gpio_reset_pin(EPD_MOSI_PIN);
    gpio_set_direction(EPD_MOSI_PIN,GPIO_MODE_OUTPUT);
    gpio_reset_pin(EPD_CS_PIN);
    gpio_set_direction(EPD_CS_PIN,GPIO_MODE_OUTPUT);

    gpio_reset_pin(EPD_DC_PIN);
    gpio_set_direction(EPD_DC_PIN,GPIO_MODE_OUTPUT);
    // DEV_Delay_ms(10);

    gpio_reset_pin(EPD_RST_PIN);
    gpio_set_direction(EPD_RST_PIN,GPIO_MODE_OUTPUT);
    // DEV_Delay_ms(10);

    gpio_reset_pin(EPD_BUSY_PIN); 
    gpio_set_direction(EPD_BUSY_PIN,GPIO_MODE_INPUT);
    // DEV_Delay_ms(10);
    return 0;
}

void DEV_SPI_WriteByte(UBYTE data)
{
    //SPI.beginTransaction(spi_settings);
    DEV_Digital_Write(EPD_CS_PIN, GPIO_PIN_RESET);

    for (int i = 0; i < 8; i++)
    {
        if ((data & 0x80) == 0) DEV_Digital_Write(EPD_MOSI_PIN, GPIO_PIN_RESET); 
        else                    DEV_Digital_Write(EPD_MOSI_PIN, GPIO_PIN_SET);

        data <<= 1;
        DEV_Digital_Write(EPD_SCK_PIN, GPIO_PIN_SET);     
        DEV_Digital_Write(EPD_SCK_PIN, GPIO_PIN_RESET);
    }

    //SPI.transfer(data);
    DEV_Digital_Write(EPD_CS_PIN, GPIO_PIN_SET);
    //SPI.endTransaction();	
}

UBYTE DEV_SPI_ReadByte()
{
    // UBYTE j=0xff;
    // GPIO_Mode(EPD_MOSI_PIN, 0);
    // digitalWrite(EPD_CS_PIN, GPIO_PIN_RESET);
    // for (int i = 0; i < 8; i++)
    // {
    //     j = j << 1;
    //     if (digitalRead(EPD_MOSI_PIN))  j = j | 0x01;
    //     else                            j = j & 0xfe;
        
    //     digitalWrite(EPD_SCK_PIN, GPIO_PIN_SET);     
    //     digitalWrite(EPD_SCK_PIN, GPIO_PIN_RESET);
    // }
    // digitalWrite(EPD_CS_PIN, GPIO_PIN_SET);
    // GPIO_Mode(EPD_MOSI_PIN, 1);
    // return j;
    return 0;
}

void DEV_SPI_Write_nByte(UBYTE *pData, UDOUBLE len)
{
    for (int i = 0; i < len; i++)
        DEV_SPI_WriteByte(pData[i]);
}

int DEV_Module_Init(void)
{
    GPIO_Init();
    DEV_Digital_Write(EPD_SCK_PIN, 0);
    DEV_Digital_Write(EPD_CS_PIN, 1);
    DEV_Digital_Write(EPD_RST_PIN, 1);

	return 0;
}

void DEV_Module_Exit(void)
{
    DEV_Digital_Write(EPD_DC_PIN, 0);
    DEV_Digital_Write(EPD_CS_PIN, 0);

    //close 5V
    DEV_Digital_Write(EPD_RST_PIN, 0);
}
